// use draw;
// use components::{Button,SelectBox};
// use draw::Screen;
use blog::Post as OldPost;
use blog2::{Post,PostDraft,PostReview};

/// 注意这里面的实现，很有指导意义，尤其对于我们理解Rust的设计和使用思路。
/// 我相信一旦对设计思路理解深入，那么对于使用上也就会明了，那么Rust 也会成为很顺手的工具。
fn main() {

    let mut blog = Post::new(); // 这会创建一个 PostDraft 也就是草稿
    blog.add_text("Hello rust, I love u.");
    let blog = blog.request_review();
    let blog = blog.approve();
    println!("--------------------------");
    println!("Blog publish success, content is : {}", blog.content());

    // 现在想编辑文章，但是 blog.edit() 并不存在，因为现在 blog:Post , 而 .edit() 是存在于 PostDraft 的。
    // 所以需要先进性状态转换调用 Post::unapprove() 然后  PostReview::reject() 最后调用 PostDraft::edit()
    let blog = blog.unapprove();
    let mut blog = blog.reject();
    blog.edit("So I will persevere learning it.");

    // 需要留意下面的写法是行不通的，（注释掉的这一行）
    // 因为Rust 在语义上表达式与变量是有很大不同的，这涉及到一些生命周期的问题。
    // let blog_content = blog.request_review().approve().content();
    let blog = blog.request_review();
    let blog = blog.approve();
    let blog_content = blog.content();
    println!("Blog edit success, content is : {}", blog_content);
}

fn old_main() {
    let mut post = OldPost::new();
    post.add_text("I ate a salad for lunch today.");
    assert_eq!("", post.content());
    println!("文章建立后的状态：{:?}", post.get_state());


    post.request_review();
    println!("提交审核的状态：{:?}", post.get_state());
    post.reject();
    println!("审核拒绝后的：{:?}", post.get_state());

    // 尝试修改文章，这里面修改应该是成功的，因为审核被拒绝后的状态是 Draft ,只有 Draft 才能修改。
    post.edit("See you at work!");
    println!("------");
    assert_eq!("", post.content(), "但是由于没有发布所以content() 还是无法返回内容的");

    post.request_review();
    println!("在审核：{:?}", post.get_state());

    // 继续修改，这是后状态式 PendingReview 所以修改会失败，那么内容理论上还是 "See you at work!"
    post.edit("I love you.");

    // 审核没有同意内容就拿不到
    assert_eq!("", post.content());

    // 通过
    post.approve();
    println!("同意后的状态：{:?}", post.get_state());
    assert_eq!("See you at work!", post.content());
}